#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
微信数据映射工具
用于将微信API返回的用户数据映射到User模型字段
"""

from typing import Dict, List

# 微信API字段到User模型字段的映射
# 基于get_friends_detail()方法返回的字段格式
# 注意：只映射数据库中实际存在的字段
FIELD_MAPPING = {
    '昵称': 'wechat_name',
    '备注': 'remark_name', 
    '微信号': 'wechat_id',
    '描述': 'description',
    '个性签名': 'signature'
    # 以下字段在数据库中不存在，暂时注释掉
    # '地区': 'region',
    # '电话': 'phone',
    # '标签': 'tags',
    # '朋友权限': 'friend_permission',
    # '共同群聊': 'common_groups',
    # '来源': 'source',
}

def map_wechat_user_data(wechat_data: Dict) -> Dict:
    """
    将微信API返回的用户数据映射到User模型字段
    
    Args:
        wechat_data: 微信API返回的用户数据
        
    Returns:
        dict: 映射后的用户数据
    """
    mapped_data = {}
    
    for wechat_field, model_field in FIELD_MAPPING.items():
        value = wechat_data.get(wechat_field)
        
        # 处理特殊值
        if value == '无' or value == '无数据' or value is None:
            value = None
        elif isinstance(value, str) and value.strip() == '':
            value = None
            
        mapped_data[model_field] = value
    
    # 设置默认值
    mapped_data['user_type'] = 1  # 默认为好友(1)，群成员(2)
    mapped_data['is_friend'] = True
    mapped_data['auto_reply_enabled'] = False
    mapped_data['is_blocked'] = False
    
    # 处理账号字段 - 如果没有微信号，使用昵称作为标识
    if not mapped_data.get('wechat_id'):
        mapped_data['account'] = mapped_data.get('wechat_name', 'unknown')
    else:
        mapped_data['account'] = mapped_data['wechat_id']
    
    return mapped_data

def batch_map_wechat_users(wechat_users: List[Dict]) -> List[Dict]:
    """
    批量映射微信用户数据
    
    Args:
        wechat_users: 微信用户数据列表
        [{'昵称': '魏存瑞', '微信号': 'wcr15110716305', '地区': '山西 大同', '备注': '爸爸', '电话': '无', '标签': '家人', '描述': '爸爸', '朋友权限': '无', '共同群聊': '1个', '个性签名': '百尺竿头', '来源': '通过扫一扫添加'},
        {'昵称': '英子', '微信号': 'wxid_c3idzunukdci22', '地区': '山西 大同', '备注': '老妈', '电话': '无', '标签': '家人', '描述': '无', '朋友权限': '无', '共同群聊': '2个', '个性签名': '无', '来源': '通过搜索微信号添加'},
        {'昵称': '魏之森林', '微信号': 'wxid_31nurflj91e422', '地区': '澳大利亚 昆士兰 布里斯班', '备注': '魏之森林', '电话': '无', '标签': '无', '描述': '无', '朋友权限': '仅聊天', '共同群聊': '无', '个性签名': 'basketball', '来源': '通过搜索微信号添加'},
        {'昵称': 'A000财富重分配', '微信号': 'caifutouzi', '地区': '浙江 杭州', '备注': 'A000财富重分配', '电话': '无', '标签': '山西人在杭州', '描述': '无', '朋友权限': '无', '共同群聊': '3个', '个性签名': '支付通道对接，软件开发，垫资还款', '来源': '通过扫一扫添加'}]
        
    Returns:
        list: 映射后的用户数据列表
    """
    return [map_wechat_user_data(user) for user in wechat_users if user]

def validate_wechat_data(wechat_data: Dict) -> bool:
    """
    验证微信数据的完整性
    
    Args:
        wechat_data: 微信数据
        
    Returns:
        bool: 数据是否有效
    """
    # 至少需要昵称或微信号
    return bool(wechat_data.get('昵称') or wechat_data.get('微信号'))

def clean_wechat_data(wechat_data: Dict) -> Dict:
    """
    清理微信数据
    
    Args:
        wechat_data: 原始微信数据
        
    Returns:
        dict: 清理后的数据
    """
    cleaned_data = {}
    
    for key, value in wechat_data.items():
        if isinstance(value, str):
            # 去除首尾空格
            value = value.strip()
            # 处理特殊值
            if value in ['无', '无数据', '暂无', '-', '']:
                value = None
        
        cleaned_data[key] = value
    
    return cleaned_data